#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// ========== INSTRUCTIONS DE TRACE SUR STDERR, FORMATTEES,  ====================
//
// Exemple    Appel     : trace2("CompName",$2)
//            Resultat  : <CompName:ball.x>
// ----------------------------------------------------------------------------

  void trace1( char *s ) { 
    fprintf(stderr,"<%s>", s);
  }

  void trace2( char *s1, char *s2 ) { 
    fprintf(stderr,"<%s:%s>", s1, s2 );
  }

  void trace3( char *s1, char *s2, char *s3 ) { 
    fprintf(stderr,"<%s:%s>%s", s1, s2, s3 );
  }

  void trace4( char *s1, char *s2, char *s3, char *s4 ) { 
    fprintf(stderr,"<%s:%s%s>%s", s1, s2, s3, s4 );
  }

// ========== POUR PREPARER LA VALEUR $$ D'UNE TETE DE REGLE ==================

  // --------------------------------------------------------------------------
  // POUR COPIER DANS $$ LA VALEUR DU n-ime TERME DE QUEUE $n
  //
  // Exemple d'utilisationdans une regle :
  //
  //             Operand:   Arg 
  //                          { $$ = copy($1); } 
  //                      ;
  // --------------------------------------------------------------------------

  char * copy( char * s ) {
    char *s1 = malloc( strlen(s) + 1 );
    strcpy( s1, s );
    return s1;
  }

  // --------------------------------------------------------------------------
  // POUR COPIER DANS $$ UNE CONCATENATION DE TERMES $nn, OU AUTRES CHAINES
  //
  // Exemple d'utilisation      $$ = c3( "private var ", $3, ":Number" );
  //                            trace2("VarDef",$$);
  // Exemple de resultat        <private var vx:Number>
  // --------------------------------------------------------------------------

  char * c2( char *s1, char *s2 ) {
    char * s = malloc( strlen(s1) + strlen(s2) + 1 );
    strcpy( s, s1 );
    strcat( s, s2 );
    return s;
  }
  char * c3( char *s1, char *s2, char *s3 ) {
    char * s = malloc( strlen(s1) + strlen(s2) + strlen(s3) + 1 );
    strcpy( s, s1 );
    strcat( s, s2 );
    strcat( s, s3 );
    return s;
  }
  char *c4(  char *s1, char *s2, char *s3, char *s4 ) {
    return c2( c2(s1,s2), c2(s3,s4) );
  }
  char *c5(  char *s1, char *s2, char *s3, char *s4, char *s5 ) {
    return c2( c3(s1,s2,s3), c2(s4,s5) );
  }
  char *c6(  char *s1, char *s2, char *s3, char *s4, char *s5, char *s6 ) {
    return c2( c3(s1,s2,s3), c3(s4,s5,s6) );
  }

  char *c7(  char *s1, char *s2, char *s3, char *s4, char *s5, char *s6 , char *s7 ) {
    return c2( c3(s1,s2,s3), c4(s4,s5,s6,s7) );
  }
